// 包裹投递
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;

set<int> tiao[N][17]; // 第i个点的第2^j次跳跃的点集合
int x[N];
int d[N];

string work() {

  for (int i = 1; i <= N; i++) {
    for (int j = 0; j < 17; j++)
      tiao[i][j].clear();
  }
  int n, m, k;
  cin >> n >> m >> k;
  for (int i = 1; i <= k; i++)
    cin >> x[i];
  for (int i = 1; i <= k; i++)
    cin >> d[i];

  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    tiao[u][0].insert(v);
    tiao[v][0].insert(u);
  }

  // 倍增
  for (int step = 1; step <= 16; step++) {
    for (int i = 1; i <= k; i++) {
      int boy = x[i];
      for (auto &son : tiao[boy][step - 1])
        tiao[boy][step].insert(
            tiao[son][step - 1].begin(), // 血泪，  tiao[boy][step]写错了
            tiao[son][step - 1].end());
    }
  }
  // 这里所说的两个城市之间的距离是指它们之间最短路径上的城市总数。例如，由一条道路直接连接的两个城市之间的距离是2。
  // 这里要改，   直接相连的两个城市之间的距离是1，  而不是2
  //  测试: 倍增后的结果 是否正确  23 = 2^4 + 2^2 + +2^1 + 2^0
  //
  //  能到达多少个点 倍增法，是否遗漏了一些点

  for (int i = 1; i <= k; i++) {
    int boy = x[i];
    int dis = d[i];

    set<int> test_st;

    for (int j = 16; j >= 0; j--) {
      if (dis >= (1 << j)) {
        cout << "跳2^" << j << "步: 能到的点有:";
        for (auto &son : tiao[boy][j]) {
          cout << son << " ";
        }
        test_st.insert(tiao[boy][j].begin(), tiao[boy][j].end());
        dis -= (1 << j);
        cout << "减掉 2^j后，  dis=" << dis << endl;
      }
    }
    test_st.insert(boy);
    int ans = test_st.size();
    cout << "总结能快递的城市数量" << ans << endl;
    if (ans < n) {
      return "NO";
    }
    // cout << ans << endl;
  }
  return "YES";
}

int main() {
  freopen("input.txt", "r", stdin);
  int T;
  cin >> T;
  while (T--) {
    cout << work() << endl;
  }

  return 0;
}